package Z007InterfaceAndExtends.O07Object;

import java.awt.geom.Path2D;

public class ObjectTest{}

class Hero{
    String name ;
    float hp ;
    float armor ;
    int moveSpeed ;

    public void useItem(Item i){
        System.out.println("hero use item");
        i.effect();

    }

    public Hero(){
        System.out.println("Hero 的无参构造！");
    }

    public Hero(String name){
        System.out.println("hero 的一个有参构造函数！");
        this.name = name ;
    }

    public void finalize(){
        /**
         * 当一个对象没有任何引用指向的时候，它就满足垃圾回收的条件
         * 当它被垃圾回收的时候，它的finalize() 方法就会被调用。
         * finalize() 不是开发人员主动调用的方法，而是由虚拟机JVM调用的
         */
        System.out.println("这个对象正在被回收");
    }

    public boolean equals(Object o){
        /**
         * equals() 用于判断两个对象的内容是否相同
         * 假设，当两个英雄的hp相同的时候，我们就认为这两个英雄相同
         */
        if (o instanceof Hero){
            Hero h = (Hero) o;
            return this.hp == h.hp;
        }
        return false;
    }

    // hashCope
    // 线程同步
    // getClass



    public static void main(String[] args){
        new Hero();
        System.out.println("=======================");
        Hero h = new Hero();
        h.name = "盖伦";
        System.out.println(h.toString());
        // 直接打印对象就是打印该对象的toString()返回值
        System.out.println(h);
        System.out.println("========================");

//        Hero h1;
//        for (int i =1 ;i < 1000000;i++){
//            h1 = new Hero();
//        }
        Hero h1 = new Hero();
        h1.hp = 300 ;
        Hero h2 = new Hero();
        h2.hp = 400 ;
        Hero h3 = new Hero();
        h3.hp = 300;
        // 这不是Object的方法，但是用于判断两个对象是否相同
        // 更准确的讲，用于判断两个引用，是否指向了同一个对象
        System.out.println(h1 == h2);
        System.out.println(h1 == h3);

        // 重写Item的 toString(), finalize()和equals()方法
        // toString() 返回Item的name + price
        // finalize() 输出当前对象正在被回收
        // equals(Object o) 首先判断o是否是Item类型，然后比较两个Item的price是否相同

    }

}

class Item{
    String name;
    int price;

    public  void effect(){
        System.out.println("调用了effect方法！");
    }
}